package com.donleo.ssm.utils;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;

/**
 * @author liangd
 * date 2020-11-24 18:25
 * code 图片上传工具类
 */
public class UploadUtils {

    public static String save(HttpServletRequest req, HttpServletResponse resp) {

        //保存图片的路径
        String savePath = CommonPath.SAVE_PATH.getValue();
        //图片前面的具体路径
        String imgPath = CommonPath.IMG_PATH.getValue();
        //new一个file类
        File file = new File(savePath, imgPath);
        //判断文件夹是否存在，如果存在，是否是文件夹，否则创建文件夹
        if (!file.exists() && !file.isDirectory()) {
            file.mkdirs();
        }
        //返回地址
        String fileUrl ="";
        try {
            //创建DiskFileItemFactory工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //创建一个文件上传解析器
            ServletFileUpload upload = new ServletFileUpload(factory);
            //设置编码格式
            upload.setHeaderEncoding("UTF-8");
            //判断提交的数据是否是表单上的数据，multpart/form-data,如果不是，返回空字符串
            if (!ServletFileUpload.isMultipartContent(req)) {

            }
            //使用ServletFileUpload解析表单数据，返回的是List<FileItem>集合，需要进行遍历
            //将上传的数据强制转换为FileItem类型
            List<FileItem> list = upload.parseRequest(req);
            for (FileItem item : list) {
                //判断表单是否是普通类型，text,select等都是普通类型，否则该表单是file类型
                if (item.isFormField()) {
                    String name = item.getFieldName();
                    String value = item.getString("UTF-8");
                    req.setAttribute(name, new String(value.getBytes()));
                } else {
                    //得到当前图片文件name名
                    String filesName = item.getFieldName();
                    //得到file文件名
                    String fileName = item.getName();
                    //判断文件名是否为空
                    if (fileName == null || "".equals(fileName.trim())) {
                        continue;
                    }
                    //substring截取字符串，如果上传的文件名前面有\\，最后一个\\后面的文件名
                    fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);

                    //InputStream getInputStream()，以流的形式返回上传文件的数据内容。
                    InputStream inputStream = item.getInputStream();

                    //保存到数据库的路径
                    String dataPath = imgPath + fileName;
                    //图片的具体路径（全路径）
                    String imgUrl = savePath + dataPath;

                    //返回地址
                    fileUrl=dataPath;
                    //文件输出流
                    FileOutputStream fileOutputStream = new FileOutputStream(imgUrl);
                    //创建一个为1M的缓冲区
                    byte buffer[] = new byte[1024];

                    int length = 0;
                    //判断流是否已经读取完毕
                    while ((length = inputStream.read(buffer)) > 0) {
                        fileOutputStream.write(buffer, 0, length);
                    }
                    //关闭输入输出流，并删除临时文件
                    inputStream.close();
                    fileOutputStream.close();
                    item.delete();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return fileUrl;
    }
}
